package com.pxst.fi.req;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.pxst.annotations.validated.DateValidator;
import com.pxst.annotations.validated.DecimalValidator;
import com.pxst.req.BasePageRsp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author rj
 * @create 2023-09-11-11:46
 */
@Data
public class FiOrderReq extends BasePageRsp {

    @ApiModelProperty(value = "充值来源银行")
    private String fromBank;

    /**
     * 银行id
     */
    @ApiModelProperty(value = "到账银行的id")
    private Long bankId;

    /**
     * 系统商户id
     */
    @ApiModelProperty(value = "系统商户id列表")
    private List<Integer> merchantIds;

    /**
     * 拼接主键
     */
    @ApiModelProperty(value = "订单号")
    private String altId;

    /**
     * 商户订单号
     */
    @ApiModelProperty(value = "商户订单号")
    private String reference;

    /**
     * 转账的银行
     */
    @ApiModelProperty(value = "转账的银行")
    private String from;

    /**
     * 接收的银行
     */
    @ApiModelProperty(value = "接收的银行")
    private String to;

    /**
     * 币别
     */
    @NotBlank(message = "币种不能为空")
    @ApiModelProperty(value = "币种", required = true)
    private String currency;

    /**
     * 状态
     */
    @ApiModelProperty(value = "状态")
    private List<Integer> statusList;

    /**
     * 收款方式
     */
    @ApiModelProperty(value = "收款方式")
    private Integer txnMode;

    /**
     * 订单通知状态
     */
    @ApiModelProperty(value = "订单通知状态")
    private Integer noticeStatus;

    /**
     * 信息
     */
    @ApiModelProperty(value = "信息")
    private String message;

    /**
     * 对账用唯一码，附言
     */
    @ApiModelProperty(value = "附言")
    private String postscript;

    /**
     * 查询vb_id是否存在，不存在为0，存在为1
     */
    @ApiModelProperty(value = "vb对账状态(0不存在，1存在)")
    private Integer vbsStatus;

    /**
     * 查询SM id是否存在，不存在为0，存在为1
     */
    @ApiModelProperty(value = "sm对账状态(0不存在，1存在)")
    private Integer smsStatus;

    @ApiModelProperty(value = "使用OTP状态")
    private List<String> vndOtpList;

    /**
     * 因为比较订单时为防止重复会加上一定的偏移量，所以存在区间
     * 订单金额区间
     */
    @DecimalValidator
    @ApiModelProperty(value = "订单金额区间")
    private List<BigDecimal> orderAmount;

    @DecimalValidator
    @ApiModelProperty(value = "请求金额区间")
    private List<BigDecimal> requestAmount;

    @DecimalValidator
    @ApiModelProperty(value = "到账金额区间")
    private List<BigDecimal> paidAmount;

    @ApiModelProperty(value = "是否隐藏没有卡可用的订单")
    private Integer hideNoCard;

    /**
     * 银行卡账户群组id
     */
    @ApiModelProperty(value = "银行卡账户群组id")
    private Long groupId;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建开始时间")
    private Date startDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建结束时间")
    private Date endDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新开始时间")
    private Date updatedStartDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "更新结束时间")
    private Date updatedEndDate;

    @ApiModelProperty(value = "完成开始时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date completedStartDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "完成结束时间")
    private Date completedEndDate;

    /**
     * 虚拟银行对账单id
     */
    @ApiModelProperty(value = "虚拟银行对账单id")
    private Long vbId;

    /**
     * SMS Monitor短信监控id
     */
    @ApiModelProperty(value = "SMS Monitor短信监控id")
    private Long smId;

    @ApiModelProperty(value = "是否是历史交易记录")
    private Integer history;

    @ApiModelProperty(value = "第三方支付名称")
    private String driver;

    @ApiModelProperty(value = "第三方支付交易类型")
    private List<Integer> tpiTxnMode;

    private Long fiId;


    // 校验有讫止时间时，必须有起始时间
    // 校验起始时间必须小于讫止时间
    // 校验起始时间必须小于当前时间
    // 校验讫止时间必须小于当前时间
    @JsonIgnore
    @DateValidator
    public Map<String, Object> getDateValidated() {
        Map<String, Object> map = new HashMap<>();
        map.put("class", FiOrderReq.class.getSimpleName());
        map.put("startDate", startDate);
        map.put("endDate", endDate);
        map.put("updatedStartDate", updatedStartDate);
        map.put("updatedEndDate", updatedEndDate);
        map.put("completedStartDate", completedStartDate);
        map.put("completedEndDate", completedEndDate);
        return map;
    }

    public List<Integer> getMerchantIds() {
        return merchantIds;
    }
}
